package com.thy.controller;


import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelStyleType;
import com.hospital.common.base.Result;
import com.hospital.common.dto.stat.module.DoctorStatDto;
import com.hospital.common.dto.stat.module.StatDto;
import com.hospital.common.vo.stat.module.DoctorStatVo;
import com.hospital.common.vo.stat.module.StatVo;
import com.thy.service.TStatService;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.util.List;

/**
 * <p>
 * 统计表 前端控制器
 * </p>
 *
 * @author iT唐
 * @since 2025-09-13
 */
@RestController
@RequestMapping("/stat")
public class TStatController {
    @Autowired
    private TStatService statService;

    /**
     * 根据时间统计每个科室信息
     * <br>定时统计每月最后一天23点执行
     *
     */
    public Result<String> allStat(@RequestBody StatDto statDto) {
        statService.allStat(statDto);
        return Result.success("定时统计成功！");
    }

    /**
     * 医生绩效统计
     * <br>定时统计每月最后一天23点执行
     * @param doctorStatDto
     * @return List<DoctorStatVo>
     */
    public Result<String> allDoctorStat(@RequestBody DoctorStatDto doctorStatDto) {
        statService.allDoctorStat(doctorStatDto);
        return Result.success("定时统计成功！");
    }

    /**
     * 根据月份查询所有科室统计信息
     * <br>管理员查看
     * @param month
     * @return List<StatVo>
     */
    @GetMapping("/getStat")
    public Result<List<StatVo>> getStat(@RequestParam("month") @DateTimeFormat(pattern = "yyyy-MM") YearMonth month) {
        LocalDateTime monthStart = month.atDay(1).atStartOfDay();
        List<StatVo> statVoList = statService.getStat(monthStart);
        return Result.success(1,"查询成功！",statVoList);
    }

    /**
     * 根据月份和科室查询所有医生统计信息
     * @param month
     * @param departmentId
     * @return List<DoctorStatVo>
     */
    @GetMapping("/getDoctorStat")
    public Result<List<DoctorStatVo>> getDoctorStat(@RequestParam("month") @DateTimeFormat(pattern = "yyyy-MM") YearMonth month, @RequestParam("departmentId") Long departmentId) {
        LocalDateTime monthStart = month.atDay(1).atStartOfDay();
        List<DoctorStatVo> doctorStatVos = statService.getDoctorStat(monthStart, departmentId);
        return Result.success(1,"查询成功！",doctorStatVos);
    }

    /**
     * 导出月份查询所有科室统计信息
     * @param response
     * @param month
     * @return
     * @throws IOException
     */
    @GetMapping("/getStat/export")
    public void getStatExport(HttpServletResponse response,@RequestParam("month") @DateTimeFormat(pattern = "yyyy-MM") YearMonth month) throws IOException {
        LocalDateTime monthStart = month.atDay(1).atStartOfDay();
        List<StatVo> statVoList = statService.getStat(monthStart);
        String fileName = month.getYear() + "年" + month.getMonthValue() + "月";
//        ExcelExportUtil.exportExcel(response, "门诊统计信息", fileName+"各科室统计信息", StatVo.class, statVoList);
        //配置Excel导出参数
        ExportParams exportParams = new ExportParams();
        exportParams.setSheetName(fileName+"各科室统计信息"); // 工作表名称
        exportParams.setStyle(ExcelStyleType.BORDER.getClazz()); // 表格样式（带边框）
        //生成Excel文件对象（Workbook）
        //基于参数、实体类结构、数据列表，通过easypoi工具类生成Excel
        Workbook workbook = ExcelExportUtil.exportExcel(
                exportParams,    // 导出参数
                StatVo.class,  // 实体类（定义Excel结构）
                statVoList         // 业务数据
        );
        //通过HTTP响应将Excel传输到客户端（触发下载）
        // 设置响应内容类型（告诉浏览器这是Excel文件）
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        // 设置响应头（指定下载方式和文件名，处理中文乱码）
        response.setHeader(
                "Content-disposition",
                "attachment;filename=" + URLEncoder.encode("案件抽查记录表", "UTF-8") + ".xlsx"
        );
        // 将Excel内容写入响应输出流，传递到客户端
        workbook.write(response.getOutputStream());
        // 刷新并关闭流
        response.getOutputStream().flush();
        workbook.close();
    }

    /**
     * 导出月份和科室查询所有医生统计信息
     * @param response
     * @param month
     * @param departmentId
     * @return
     * @throws IOException
     */
    @GetMapping("/getDoctorStat/export")
    public void getDoctorStatExport(HttpServletResponse response, @RequestParam("month") @DateTimeFormat(pattern = "yyyy-MM") YearMonth month, @RequestParam("departmentId") Long departmentId) throws IOException {
        LocalDateTime monthStart = month.atDay(1).atStartOfDay();
        List<DoctorStatVo> doctorStatVos = statService.getDoctorStat(monthStart, departmentId);
        //String departmentName = statService.getBaseMapper().selectById(departmentId).getDepartment();
        String fileName = month.getYear() + "年" + month.getMonthValue() + "月";
//        ExcelExportUtil.exportExcel(response, "医生绩效统计信息", fileName+departmentName+"医生绩效信息", DoctorStatVo.class, doctorStatVos);
        //配置Excel导出参数
        ExportParams exportParams = new ExportParams();
        exportParams.setSheetName(fileName+"各科室统计信息"); // 工作表名称
        exportParams.setStyle(ExcelStyleType.BORDER.getClazz()); // 表格样式（带边框）
        //生成Excel文件对象（Workbook）
        //基于参数、实体类结构、数据列表，通过easypoi工具类生成Excel
        Workbook workbook = ExcelExportUtil.exportExcel(
                exportParams,    // 导出参数
                DoctorStatVo.class,  // 实体类（定义Excel结构）
                doctorStatVos         // 业务数据
        );
        //通过HTTP响应将Excel传输到客户端（触发下载）
        // 设置响应内容类型（告诉浏览器这是Excel文件）
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        // 设置响应头（指定下载方式和文件名，处理中文乱码）
        response.setHeader(
                "Content-disposition",
                "attachment;filename=" + URLEncoder.encode("案件抽查记录表", "UTF-8") + ".xlsx"
        );
        // 将Excel内容写入响应输出流，传递到客户端
        workbook.write(response.getOutputStream());
        // 刷新并关闭流
        response.getOutputStream().flush();
        workbook.close();
    }


}
